// 题意：给定n个硬币面值Ai和相应个数Ci，问最多可以凑出多少个1～m的价值。
//       n <= 100, m <= 100000, Ci <= 1000。
//
// 题解：最暴力的背包就是O(n*m*C)，但是会超时，事实上转移的时候只会和
//       j, j - Ai, j - 2*Ai, ... , j - Ci*Ai有关，
//       这其中如果有一个是可行的，那么对于前i个硬币，面值为j就一定可行。
//       维护一个tot数组表示与j在同一个模Ai剩余系的可行的个数，
//       每次看tot[j] - tot[j - Ci*Ai]是不是大于零，如果是j也可行。
//       这样总的复杂度降到O(n*m)。
//
// run: time $exec < input
#include <iostream>
#include <utility>

int const maxn = 107;
int const maxm = 100007;

bool f[2][maxm];
int tot[maxm];
std::pair<int, int> da[maxn];
int n, m, circle;

int main()
{
	std::ios::sync_with_stdio(false);
	while (std::cin >> n >> m && (n || m)) {
		for (int i = 0; i < n; i++) std::cin >> da[i].first;
		for (int i = 0; i < n; i++) std::cin >> da[i].second;

		for (int i = 0; i <= m; i++) f[0][i] = f[1][i] = false;
		f[0][0] = true;
		int current = 0, prev = 0;
		for (int i = 0; i < n; i++) {
			current ^= 1; prev = current ^ 1;
			circle = da[i].first * (da[i].second + 1);
			for (int j = 0; j <= m; j++) {
				tot[j] = f[current][j] = f[prev][j];
				if (j >= da[i].first) tot[j] += tot[j - da[i].first];
				if (f[current][j]) continue;
				int tmp = tot[j];
				if (j >= circle) tmp -= tot[j - circle];
				if (tmp) f[current][j] = true;
			}
		}
		int ans = 0;
		for (int i = 1; i <= m; i++) ans += f[current][i];
		std::cout << ans << '\n';
	}
}

